{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d14a167e",
   "metadata": {},
   "source": [
    "# CIS Demo"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "419b1723",
   "metadata": {},
   "source": [
    "## Dependencies and Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f4b3b145",
   "metadata": {},
   "outputs": [],
   "source": [
    "#@title Install dependencies\n",
    "\n",
    "!pip install -q omegaconf\n",
    "\n",
    "import torch\n",
    "from pprint import pprint\n",
    "from omegaconf import OmegaConf\n",
    "from IPython.display import Audio, display\n",
    "\n",
    "torch.hub.download_url_to_file('https://raw.githubusercontent.com/snakers4/silero-models/master/models.yml',\n",
    "                               'latest_silero_models.yml',\n",
    "                               progress=False)\n",
    "models = OmegaConf.load('latest_silero_models.yml')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6b8b2b6c",
   "metadata": {},
   "source": [
    "## Load model"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cd0fb35e",
   "metadata": {},
   "source": [
    "Available models:\n",
    "- v5_cis_base\n",
    "- v5_cis_base_nostress\n",
    "- v5_cis_ext"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82f20891",
   "metadata": {},
   "source": [
    "**Important notes:**\n",
    "- `v5_cis_base` and `v5_cis_ext` models assume that proper stress should be added for each word for all languages, i.e. к+ошка;\n",
    "- `v5_cis_base_nostress` models assume that proper stress should be added for each word ONLY for slavic languages (i.e. ru, bel, ukr);\n",
    "- It is recommended to select a speaker that matches the target language. For example, to generate text in Kazakh, select `kaz_zhadyra`. To generate Russian text with the same voice, select `ru_zhadyra`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1045ca7d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T16:06:21.078823Z",
     "start_time": "2025-11-21T16:06:18.566283Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "\n",
    "model_id = 'v5_cis_base_nostress'\n",
    "\n",
    "device = torch.device('cpu')\n",
    "\n",
    "model, example_text = torch.hub.load(repo_or_dir='snakers4/silero-models',\n",
    "                                     model='silero_tts',\n",
    "                                     language='ru',\n",
    "                                     speaker=model_id)\n",
    "model.to(device)  # gpu or cpu"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9675dce6",
   "metadata": {},
   "outputs": [],
   "source": [
    "val_texts = {\n",
    "    'aze': 'Mən hər səhər erkən qalxıb təzə hava ilə məşq edirəm.',\n",
    "    'bak': 'Мин һәр саңғыраҡ тауҙа түбәнәгендә йәйенә йөҙөп йөрөйм.',\n",
    "    'bel': '+Я в+ечарам любл+ю чыт+аць цік+авыя кн+ігі пры св+ятле нач+овай л+ямпы.',\n",
    "    'chv': 'Эпĕ ача чухнех пиччĕшсемпе юнашар кĕтӳльех вăйă вылянă.',\n",
    "    'erz': 'Монь веленек шачемсёномань панжовксонть кис эрьва кизонь туема.',\n",
    "    'hye': 'Ես շաբաթ օրերին սիրում եմ երկար զբոսնել անտառով:',\n",
    "    'kat': 'მე ძალიან მიყვარს ჩემი ოჯახის წევრებთან ერთად დროის გატარება.', \n",
    "    'kaz': 'Мен балалық шақта жаңа досдармен танысуды әбден ұнататынмын.',\n",
    "    'kbd': 'Сэ уиӀуанэ уашъхъэри унагъуэхэри сэбэп хъущтыр сыту щӀэлъэӀу.',\n",
    "    'kir': 'Мен мектепте окуп жүргөндө эң жакшы досум менен тааныштым.',\n",
    "    'kjh': 'Мин аал чоньчарға пастабахсынар хайдиғырам хынаңның хоный.',\n",
    "    'mdf': 'Монь тяштеть эзда кизонь карьхть сельметь кштинь аф лац.',\n",
    "    'sah': 'Мин бүгүн оройунан саһарҕа оонньуу сылдьан сымнаҕыстык утуйбутум.',\n",
    "    'tat': 'Мин ерак түгел урман эчендә чиста һавада йөргәне яратам.',\n",
    "    'tgk': 'Ман дар бораи хонаи нави худ дар канори дарё хондем.',\n",
    "    'udm': 'Мон ашалэ тӥлед нуналлы огы быдэсэ кошко учке.',\n",
    "    'ukr': '+Я з р+аннього дит+инства д+уже любл+ю сл+ухати цік+аві к+азки.',\n",
    "    'uzb': \"Men bolaligimda ko'pincha do'stlarim bilan hovlida futbol o'ynardim.\",\n",
    "    'xal': 'Би эцкд сарин җилин дуулҗана хойр седклтә күрәм.'\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a3f9a145",
   "metadata": {},
   "source": [
    "### List speakers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cb751453",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T15:46:18.088605Z",
     "start_time": "2025-11-21T15:46:17.718929Z"
    }
   },
   "outputs": [],
   "source": [
    "sorted(model.speakers)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a9dfc8e",
   "metadata": {},
   "source": [
    "## Example"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "59b657fd",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T16:09:51.442259Z",
     "start_time": "2025-11-21T16:09:51.439666Z"
    }
   },
   "source": [
    "### Slavic(ru/bel/ukr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dc3f86f6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# v5_cis_base_nostress\n",
    "sample_rate = 48000\n",
    "speaker = 'ukr_igor'\n",
    "\n",
    "example_text = '+Я з р+аннього дит+инства д+уже любл+ю сл+ухати цік+аві к+азки.'\n",
    "\n",
    "audio = model.apply_tts(text=example_text,\n",
    "                        speaker=speaker,\n",
    "                        sample_rate=sample_rate)\n",
    "print(example_text)\n",
    "display(Audio(audio, rate=sample_rate))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "842e04db",
   "metadata": {},
   "outputs": [],
   "source": [
    "# v5_cis_base_nostress\n",
    "sample_rate = 48000\n",
    "speaker = 'ru_zhadyra'\n",
    "\n",
    "example_text = 'брод+ить с дожд+ём п+од +окнами тво+ими.'\n",
    "\n",
    "audio = model.apply_tts(text=example_text,\n",
    "                        speaker=speaker,\n",
    "                        sample_rate=sample_rate)\n",
    "print(example_text)\n",
    "display(Audio(audio, rate=sample_rate))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94f5cebe",
   "metadata": {},
   "source": [
    "### Not slavic"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8435e161",
   "metadata": {},
   "outputs": [],
   "source": [
    "# v5_cis_base_nostress\n",
    "sample_rate = 48000\n",
    "speaker = 'kaz_zhadyra'\n",
    "\n",
    "example_text = 'Мен балалық шақта жаңа досдармен танысуды әбден ұнататынмын.'\n",
    "\n",
    "audio = model.apply_tts(text=example_text,\n",
    "                        speaker=speaker,\n",
    "                        sample_rate=sample_rate)\n",
    "print(example_text)\n",
    "display(Audio(audio, rate=sample_rate))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "141481cc",
   "metadata": {},
   "outputs": [],
   "source": [
    "sample_rate = 48000\n",
    "speaker = 'hye_zara'\n",
    "\n",
    "example_text = 'Ես շաբաթ օրերին սիրում եմ երկար զբոսնել անտառով:'\n",
    "\n",
    "audio = model.apply_tts(text=example_text,\n",
    "                        speaker=speaker,\n",
    "                        sample_rate=sample_rate)\n",
    "print(example_text)\n",
    "display(Audio(audio, rate=sample_rate))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
